package com.yu8home.opcua.test;

import com.yu8home.opcua.OpcUAUtil;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

@Slf4j
public class WriteBatch {

    public static void main(String[] args) throws Exception {
        OpcUAUtil.getConnect();

        long x = System.currentTimeMillis();
        List<OpcUABO> rows = new ArrayList<>();

        OpcUABO a = new OpcUABO();
        a.setMarkName("aaaa.1.温度偏高报警值");// 300
        a.setRawDataType("Word");
        a.setValue("300");
        rows.add(a);

        OpcUABO b = new OpcUABO();
        b.setMarkName("aaaa.1.温度偏低报警值");// 100
        b.setRawDataType("Word");
        b.setValue("100");
        rows.add(b);

        OpcUABO c = new OpcUABO();
        c.setMarkName("aaaa.1.氧气偏低报警值");// 1800
        c.setRawDataType("Word");
        c.setValue("1800");
        rows.add(c);

        OpcUABO d = new OpcUABO();
        d.setMarkName("aaaa.1.氧气偏高报警值");// 2500
        d.setRawDataType("Word");
        d.setValue("2500");
        rows.add(d);


        OpcUABO aa = new OpcUABO();
        aa.setMarkName("aaaa.2.温度偏高报警值");// 300
        aa.setRawDataType("Word");
        aa.setValue("300");
        rows.add(aa);

        OpcUABO bb = new OpcUABO();
        bb.setMarkName("aaaa.2.温度偏低报警值");// 100
        bb.setRawDataType("Word");
        bb.setValue("100");
        rows.add(bb);

        OpcUABO cc = new OpcUABO();
        cc.setMarkName("aaaa.2.氧气偏低报警值");// 1800
        cc.setRawDataType("Word");
        cc.setValue("1800");
        rows.add(cc);

        OpcUABO dd = new OpcUABO();
        dd.setMarkName("aaaa.2.氧气偏高报警值");// 2500
        dd.setRawDataType("Word");
        dd.setValue("2500");
        rows.add(dd);

        writes(rows);
        log.info("readNode耗时：{}", System.currentTimeMillis() - x);
    }

    /**
     * 批量-写
     */
    public static void writes(List<OpcUABO> rows) {
        long x = System.currentTimeMillis();

        List<NodeId> nodeIds = new ArrayList<>();
        List<DataValue> values = new ArrayList<>();

        for (OpcUABO t : rows) {
            String markName = t.getMarkName();

            NodeId nodeId = new NodeId(2, markName);
            DataValue newValue = OpcUAUtil.getDataValue(t.getRawDataType(), t.getValue());

            nodeIds.add(nodeId);
            values.add(newValue);
        }

        CompletableFuture<List<StatusCode>> listCompletableFuture = OpcUAUtil.opcUaClient.writeValues(nodeIds, values);
        List<StatusCode> statusCodes = null;
        try {
            statusCodes = listCompletableFuture.get();
        } catch (Exception e) {
            e.printStackTrace();
        }

        for (StatusCode t : statusCodes) {
            log.error("批量-写数据：{}，耗时：{}", t.toString(), System.currentTimeMillis() - x);
        }
    }

}
